/*
*
* 版权所有 Copyleft(c) 2005
* 刘炯个人工作室 Sharp-Mark Personal Studio
*
* 允许自由使用，复制，修改，传播和贩卖此源程序及其文档，而不必支付任何费用。
* 以上的版权信息必须出现在每一份复制品中。同时这份版权信息和许可声明
* 也必须出现在支持文档中。刘炯个人工作室不对此软件适于那种具体
* 用途做出任何阐述。此代码只作为代码本身提供对其品质不做任何保证。
*
*/
#pragma once
#include "stdafx.h"

const int TOWER_NUMBER = 3;
const int PLATE_WIDTH = 20;
const int PLATE_HEIGHT = 15;

class Plate
{
public:
	Plate(){ Plate(0, 0, RGB(0, 0, 0)); }
	Plate(int w, int h, COLORREF c) : _width(w), _height(h), _color(c){}

	int Width(){ return _width; }
	int Height(){ return _height; }
	COLORREF Color(){ return _color; }

private:
	int _width, _height;
	COLORREF _color;
};

class Tower
{
public:
	Tower();
	void PushOnePlate(Plate*);			// 移入一个块
	Plate* PopOnePlate();				// 移出一个快
	vector< Plate* > Plates;			// 已有的块向量（也就是块数组）
};

class Hanoi
{
// 方法
public:
	Hanoi(int level, CPaintDC& dc, CRect& clientRect);
	~Hanoi();
	void Run();

// 私有字段
protected:
	Tower _towers[TOWER_NUMBER];		// 塔的数组
	int _level;							// 块层数
	int _step;							// 搬运步数
	CPaintDC& _dc;
	CRect _rect;
	Plate* _plates;						// 已有的块数组

// 私有方法
protected:
	void DrawHanoi();
	void DrawTower(Tower&, int, int);	// 画塔
	void DrawPlate(Plate&, int, int);	// 画盘子


	void MovePlates(Tower&, Tower&, Tower&, int);	// 移动盘子
	// void MoveOnePlate(Tower&, Tower&);

private:
	Hanoi();
};